﻿using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioTipoFonteGeradora : IRepositorioTipoFonteGeradora
    {
        public TipoFonteGeradora Inserir(TipoFonteGeradora tipoFonteGeradora)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(tipoFonteGeradora);
            return tipoFonteGeradora;
        }

        public TipoFonteGeradora Atualizar(TipoFonteGeradora tipoFonteGeradora)
        {
            TipoFonteGeradora tmpTipoFonteGeradora = ObterPorId(tipoFonteGeradora.TipoFonteGeradoraId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpTipoFonteGeradora.Codigo = tipoFonteGeradora.Codigo;
            tmpTipoFonteGeradora.Descricao = tipoFonteGeradora.Descricao;
            tmpTipoFonteGeradora.FimVigencia = tipoFonteGeradora.FimVigencia;
            tmpTipoFonteGeradora.InicioVigencia = tipoFonteGeradora.InicioVigencia;
            tmpTipoFonteGeradora.NeturionLog = tipoFonteGeradora.NeturionLog;

            GerenciadorBDConfigs.Instance.SessaoAtual().Update(tmpTipoFonteGeradora);
            return tmpTipoFonteGeradora;
        }

        public void Excluir(TipoFonteGeradora tipoFonteGeradora)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(tipoFonteGeradora);
        }

        public IList<TipoFonteGeradora> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(TipoFonteGeradora));
            return criteria.List<TipoFonteGeradora>() as List<TipoFonteGeradora>;
        }

        public TipoFonteGeradora ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<TipoFonteGeradora>(id);
        }

        public IList<TipoFonteGeradora> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string codigo, string descricao, DateTime? inicioVigenciaDe, DateTime? inicioVigenciaAte, DateTime? fimVigenciaDe, DateTime? fimVigenciaAte)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(TipoFonteGeradora))
               .SetFirstResult(inicio).SetMaxResults(quantidade);

            if (!string.IsNullOrEmpty(codigo))
            {
                criteria.Add(Restrictions.Eq("Codigo", codigo));
            }

            if (!string.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }

            if (inicioVigenciaDe.HasValue)
            {
                criteria.Add(inicioVigenciaAte.HasValue
                         ? Restrictions.Between("InicioVigencia", inicioVigenciaDe.Value.Date, inicioVigenciaAte.Value.Date)
                         : Restrictions.Eq("InicioVigencia", inicioVigenciaDe.Value.Date));
            }

            if (fimVigenciaDe.HasValue)
            {
                criteria.Add(fimVigenciaAte.HasValue
                    ? Restrictions.Between("FimVigencia", fimVigenciaDe.Value.Date, fimVigenciaAte.Value.Date)
                    : Restrictions.Eq("FimVigencia", fimVigenciaDe.Value.Date));
            }

            return criteria.List<TipoFonteGeradora>() as List<TipoFonteGeradora>;
        }

        public TipoFonteGeradora ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(ContaContabil))
               .Add(Restrictions.Eq("Codigo", codigo));

            return criteria.UniqueResult<TipoFonteGeradora>() as TipoFonteGeradora;
        }
    }
}